﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace Formation_Entreprise
{
    /// <summary>
    /// La classe Rapport contient toutes les méthodes
    /// pour produire les rapports
    /// </summary>
    class Rapports
    {
        ///<summary>
        ///Méthode pour produire le rapport entre 2 dates données
        /// </summary>
        ///<param name="DateDebut">La date de début pour le rapport</param>
        ///<param name="DateFin">La date de fin pour le rapport</param>
        public static Dictionary<int, double> ObtenirRapportPeriodique(DateTime DateDebut, DateTime DateFin)
        {
            // Requete à utiliser
            //string query = "SELECT Nom, Montant FROM Facture fa, Formation fo, Conseiller c WHERE fa.DateFacturation BETWEEN @p1 AND @p2 AND c.NoConseiller=fo.NoConseiller AND fa.NoFormation=fo.NoFormation ORDER BY Nom";
            string query = "SELECT NoConseiller, Montant FROM Facture WHERE DateFacturation BETWEEN @p1 AND @p2";

            // Connection à la base de donnée et Associer la requete avec la connection
            OleDbConnection oledbcn = ConnectionBD.ObtenirConnection();
            OleDbCommand oledbcmd = new OleDbCommand(query, oledbcn);

            // Parametres
            oledbcmd.Parameters.AddWithValue("@p1", OleDbType.Date);
            oledbcmd.Parameters["@p1"].Value = DateDebut;
            oledbcmd.Parameters.AddWithValue("@p2", OleDbType.Date);
            oledbcmd.Parameters["@p2"].Value = DateFin;

            // Initialisation du reader
            OleDbDataReader reader = null;

            // Création du dictionaire 
            Dictionary<int, double> dicFacture = new Dictionary<int, double>();
            try
            {
                // Ouvrir la conection et exécuter la requete
                oledbcn.Open();
                reader = oledbcmd.ExecuteReader();

                // Mettre chaques Conseiller dans le dictionnaire
                while (reader.Read())
                {
                    // Vérification si le conseiller est deja present
                    if (dicFacture.ContainsKey(Convert.ToInt32(reader["NoConseiller"])))
                    {
                        // Supression de l'entrée, cumuler les montant et ajouter le conseiller de nouveau
                        double montant = dicFacture[Convert.ToInt32(reader["NoConseiller"])];
                        dicFacture.Remove(Convert.ToInt32(reader["NoConseiller"]));
                        dicFacture.Add(Convert.ToInt32(reader["NoConseiller"]), montant + Convert.ToDouble(reader["Montant"]));
                    }
                    else
                    {
                        // Ajout du conseiller et de sont montant
                        dicFacture.Add(Convert.ToInt32(reader["NoConseiller"]), Convert.ToDouble(reader["Montant"]));
                    }
                }
            }
            catch (OleDbException ex) { throw ex; }

            // Fermeture du reader et fermeture de la conection à la base de donnée
            reader.Close();
            oledbcn.Close();

            //Retour de la liste avec les entreprises
            return dicFacture;
        }


        ///<summary>
        ///Méthode pour produire le rapport pour un conseiller donné
        /// </summary>
        /// <param name="nomConseiller">Le nom du conseiller visé dans le rapport</param>
        public static Dictionary<string, double> ObtenirRapportConseillers(string nomConseiller)
        {
            // Requete à utiliser
            //string query = "SELECT DateFacturation, Montant FROM Facture fa, Formation fo, Conseiller c WHERE Nom=@p1 AND c.NoConseiller=fo.NoConseiller AND fa.NoFormation=fo.NoFormation ORDER BY DateFacturation";
            string query = "SELECT DateFacturation, Montant FROM Facture, Conseiller WHERE Conseiller.Nom LIKE @p1 AND Conseiller.NoConseiller = Facture.NoConseiller ORDER BY DateFacturation";
            
            // Connection à la base de donnée et Associer la requete avec la connection
            OleDbConnection oledbcn = ConnectionBD.ObtenirConnection();
            OleDbCommand oledbcmd = new OleDbCommand(query, oledbcn);

            // Parametres
            oledbcmd.Parameters.AddWithValue("@p1", nomConseiller);

            // Initialisation du reader
            OleDbDataReader reader = null;

            // Création de la list de retour listEntreprise
            Dictionary<string, double> dicFacture = new Dictionary<string, double>();
            try
            {
                //ouvrir la conection
                oledbcn.Open();

                // Exécuter la requete
                reader = oledbcmd.ExecuteReader();

                // Mettre chaque dates dans le dictionnaire
                while (reader.Read())
                {
                    // Vérification si la date est deja presente
                    if (dicFacture.ContainsKey(DateTime.Parse(reader["DateFacturation"].ToString()).ToString("dd/MM/yyyy")))
                    {
                        // Supression de l'entrée, cumuler les montant et reajouter la date
                        double montant = dicFacture[DateTime.Parse(reader["DateFacturation"].ToString()).ToString("dd/MM/yyyy")];
                        dicFacture.Remove(DateTime.Parse(reader["DateFacturation"].ToString()).ToString("dd/MM/yyyy"));
                        dicFacture.Add(DateTime.Parse(reader["DateFacturation"].ToString()).ToString("dd/MM/yyyy"), Convert.ToDouble(reader["Montant"]) + montant);
                    }
                    else
                        // Ajout de la date et de son montant
                        dicFacture.Add(DateTime.Parse(reader["DateFacturation"].ToString()).ToString("dd/MM/yyyy"), Convert.ToDouble(reader["Montant"]));
                }
            }
            catch (OleDbException ex) { throw ex; }
            // Fermeture du reader et fermeture de la conection à la base de donnée
            reader.Close();
            oledbcn.Close();

            // Retour de la liste avec les entreprises
            return dicFacture;
        }
    }
}